package cn.le.InternalClass;

import java.util.Random;

/**
 * Created by admin on 2017/5/11.
 * 使用.class也可生成对Class对象的引用，但不会自动地初始化该Class对象，
 * 为了使用类而做的准备工作实际包含三个步骤：
 * 1，加载，这是由类加载器执行的，该步骤将查找字节码（通常在classpath所指的路径中查找，但这并非是必须的），并从这些字节中创建一个class对象。
 * 2,链接，在链接阶段将验证类中的字节码，为静态域分配储存空间，并且如果必须的话，将解析这个类创建对其他类的所有引用。
 * 3,初始化，如果该类具有超类，则对其初始化，执行静态初始化和静态初始化快，初始化被延迟到对静态方法（构造器映射地是静态的）或者非常数静态域进行首次引用才执行。
 * 初始化尽可能的实现了“惰性”
 *
 */
public class Initable {

    static final int staticFinal = 47;//static final修饰的值是“预编译常量”，这个值不需要对Initable类进行初始化就可以被读取到。
    static final int staticFinal2 = ClassInitalization.rand.nextInt(1000);//这个值需要执行代码才能获取，不是一个“预编译常量”，所以的它的访问将强制进行类的初始化

    static {
        System.out.println("InitIalizing Initable");
    }
}

class Initable2{
    static int staticNonFinal = 147;
    static {
        System.out.println("InitIalizing Initable2");
    }
}
class Initable3{
    static int staticNonFinal = 74;//一个static域不是final的，那么在对它进行访问时，总是要求在它被读取之前，要先进行连接（为这个域分配存储空间）
    //和初始化（初始化该存储空间）
    static {
        System.out.println("InitIalizing Initable3");
    }
}

class ClassInitalization{

    public static Random rand = new Random(47);

    public static void main(String[] args) throws Exception {

        Class initable = Initable.class;
        System.out.println(1);
        System.out.println(Initable.staticFinal);
        System.out.println(Initable.staticFinal2);
        System.out.println(Initable2.staticNonFinal);
        Class initable3 = Class.forName("cn.le.InternalClass.Initable3");
        System.out.println(Initable3.staticNonFinal);

        Class intClass = int.class;
        initable = double.class;

        //Class<Number> itgClass = int.class;

    }
}

class Building{

    public void put()
    {
        System.out.println("Building");
    }
}
class House extends  Building{

    public void put()
    {
        System.out.println("House");
    }
}
class ClassCasts{

    public static void main(String[] args) {
        Building building = new Building();
        House house = new House();
        Class<House> houseClass = House.class;
        House h = houseClass.cast(house);
        h.put();

    }

}



















